/*这道题是我感觉这五道题里最难的一道，我反复重写了两遍左右，提一下注意点
1.循环动态分配内存不利于后续输出数组，因为你每次动态分配，指针会跟着跑，跑到后面你很难找到开头，来把这个字符输出
2.所以我用的是一次性记录所有的区间，一次性分配内存
3.我个人觉得自己的写法比较繁冗，引入了很多貌似无所谓的新变量，但我我实在想不到别的更简便的方法，可以期待蹲一下题解*/
#include<iostream>
using namespace std;
#define arraySize 10
#define arrayNum 3
int main()
{
    int time;
    cin>>time;
    while(time--)
    {
        char *str1,*str2,*str3,*newStr;
        int num[6],sum=0;
        str1=new char[arraySize];
        str2=new char[arraySize];
        str3=new char[arraySize];
        //分配原始三个字符串的内存
        cin>>str1>>str2>>str3;
        for(int i=0;i<arrayNum*2;i+=2)
        {
            cin>>num[i]>>num[i+1];
            sum=sum+(num[i+1]-num[i]+1);
        }
        //记录所有的区间
        newStr=new char[sum];
        //一次性分配
        char *start=newStr;
        //这个start我觉得貌似不用，但是我需要记录newStr的一个头在哪里，所以我还是用了
        for(int i=0;i<arrayNum*2;i+=2)
        {
            char *point;
            if(i==0)
                point=str1;
            else if(i==2)
                point=str2;
            else if(i==4)
                point=str3;
            for(int j=num[i]-1;j<num[i+1];j++)
            {
                *newStr=*(point+j);
                newStr++;
            }
        }
        newStr=&newStr[0];
        //合并的过程
        for(int i=0;i<sum;i++)
        {
            cout<<*(start+i);
        }
        cout<<endl;
        delete[] str1;
        delete[] str2;
        delete[] str3;
        delete[] newStr;
    }
    return 0;
}